package com.guocheng.utils;

import com.guocheng.common.annotation.ModelField;

import java.lang.reflect.Field;

public class ModelFieldUtils {

    /**
     * 实体类互相转换
     *
     * @param o   要转换的数据
     * @param <T> 转换后的实体类
     * @return
     */
    public static <T> T to(Object o, Class<T> c) {
        T t = null;
        String name = null;
        try {
            //转换后新的类
            t = c.newInstance();
            //获取要赋值的每一个字段
            Field[] fields = t.getClass().getDeclaredFields();
            //转换前的类
            Class<?> o1 = o.getClass();

            for (Field field : fields) {
                //获取要转换的值的名称
                ModelField annotation = field.getAnnotation(ModelField.class);
                //获取字段名称
                if (annotation != null) {
                    //获取字段名称
                    name = annotation.value();
                } else {
                    //获取字段名称
                    name = field.getName();
                }
                //要获取的值的字段
                Field ov = null;
                try {
                    ov = o1.getDeclaredField(name);
                } catch (Exception e) {
                    continue;
                }
                //强制获取
                ov.setAccessible(true);
                //获取字段值
                Object value = ov.get(o);

                if (value == null) continue;
                //强制获取
                field.setAccessible(true);
                //赋值
                field.set(t, value);
            }
        } catch (Exception e) {
            throw new RuntimeException("'" + name + "'字段赋值失败！", e);
        }
        return t;
    }
}
